package com.best.design.observer.step3.event;

import com.best.design.observer.step3.LotteryResult;
import com.best.design.observer.step3.event.listener.EventListener;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 事件管理器
 */
public class EventManager {

	Map<Enum<EventType>, List<EventListener>> listeners = new HashMap<>();

	public EventManager(Enum<EventType>... operations) {
		for (Enum<EventType> operation : operations) {
			this.listeners.put(operation, new ArrayList<>());
		}
	}

	public enum EventType {
		MQ,
		Message
	}

	/**
	 * 订阅
	 * @param eventType 事件类型
	 * @param listener  监听
	 */
	public void subscribe(Enum<EventType> eventType, EventListener listener) {
		List<EventListener> users = listeners.get(eventType);
		users.add(listener);
	}

	/**
	 * 取消订阅
	 * @param eventType 事件类型
	 * @param listener  监听
	 */
	public void unsubscribe(Enum<EventType> eventType, EventListener listener) {
		List<EventListener> users = listeners.get(eventType);
		users.remove(listener);
	}

	/**
	 * 通知
	 * @param eventType 事件类型
	 * @param result    结果
	 */
	public void notify(Enum<EventType> eventType, LotteryResult result) {
		List<EventListener> users = listeners.get(eventType);
		for (EventListener listener : users) {
			listener.doEvent(result);
		}
	}

}
